<!-- 
    js解析器在运行js代码的时候分两步：预解析和代码执行
 -->
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        //1.js解析器在运行js代码的时候分两步：预解析和代码执行
        //2.预解析：js引擎会把js里面所有的var还有function提升到当前的作用域的最前面
        //代码执行(按照代码执行顺序从上顺序执行)

        //预解析分为变量预解析(变量提升)和函数预解析(函数提升)
        // 1)变量提升  就是把所有的变量声明提升带当前作用域的最前面  不提升赋值操作
        // 2)函数提升  就是把所有函数声明提升带当前作用域的最前面    不调用函数


        /* 1.第一种情况 */
        console.log(num); //1.这里会报错


        /* 2.第二种情况 */
        console.log(num); //输出undefined
        var num = 10;
        //上面的代码相当于执行了一下的代码
        var num;   //就是把所有的变量声明提升带当前作用域的最前面  不提升赋值操作
        console.log(num);
        num = 10;


        /* 3.第三种情况 */
        fn();   //这个放在函数的前面和后面都会执行
        //函数提升，会把函数放在调用者最前面，所以放前面后面都会默认函数在最前面
        function fn() {
            console.log(11);
        }


        /* 4.第四种情况 */
        fun();    //放在函数前面就不会执行，(函数表达式，调用必须写在函数表达式的下面)
        var fun = function () {
            console.log(22);
        }
        //上面的代码相当于执行了下面的代码
        var fun;
        fun();   //这里执行错误
        fun = function () {
            console.log(22);
        }














    </script>
</head>

<body>

</body>

</html>